package main

import "fmt"

// 定义一个接口 Animal，包含一个 Speak 方法
type Animal interface {
	Speak() string // 所有实现 Speak() 方法的类型都可以看作是 Animal 类型
}

// 定义一个结构体 Dog
type Dog struct {
	Name string
}

// 为 Dog 实现 Speak 方法
func (d Dog) Speak() string {
	return "Woof! My name is " + d.Name
}

// 定义一个结构体 Cat
type Cat struct {
	Name string
}

// 为 Cat 实现 Speak 方法
func (c Cat) Speak() string {
	return "Meow! My name is " + c.Name
}

func main() {
	// 声明一个 Animal 接口变量
	var a Animal

	// 创建一个 Dog 实例
	dog := Dog{Name: "Buddy"}
	a = dog                // 因为 Dog 实现了 Animal 接口，所以可以赋值给 a
	fmt.Println(a.Speak()) // 输出: Woof! My name is Buddy

	// 创建一个 Cat 实例
	cat := Cat{Name: "Whiskers"}
	a = cat                // Cat 同样实现了 Animal 接口
	fmt.Println(a.Speak()) // 输出: Meow! My name is Whiskers

	// 可以将不同类型的对象统一处理
	animals := []Animal{dog, cat}
	for _, animal := range animals {
		fmt.Println(animal.Speak())
	}
}
